|
본격적인 구현에 앞서, 라이브러리를 불러온다.
GPU 리소스를 처음부터 full로 먹지 않도록 |
|
|
논문과 달리, 텐서플로에서 제공하는 "ImageNet 데이터셋으로 사전 훈련된(Pre-trained) VGG16"을 백본(Backbone)으로 불러온다. 이때, 입력 이미지 사이즈는 논문과 동일하게 448x448로 한다. 활성함수(activation function)로 마지막 레이어에서 Linear를 사용하고, 나머지 모든 레이어는 LeakyRelu를 사용한다. |
|
|
드롭아웃(Dropout) 레이어는 비율을 0.5로 하여 첫 FC 레이어 뒤에 둔다. 학습(training)에서 Loss가 튀는 것을 방지하기 위해서 Linear 대신 Sigmoid를 사용한다. 최종 출력 shape은 7x7x30이다. |
|
|
손실함수(loss function)를 계산하기 위해서, 먼저 IoU 값을 구하는 function을 구현해야 한다. 손실 함수는Classification Loss \( \displaystyle\sum_{i=0}^{S^2} \Bbb{1}^{obj}_{i} \sum_{c\in class} (p_i(c)-\hat{p_i}(c))^2 \)Confidence Loss \( \displaystyle\sum_{i=0}^{S^2} \sum_{j=0}^{B} \Bbb{1}^{obj}_{ij} (C_i-\hat{C_i})^2 + \lambda_{noobj}\displaystyle\sum_{i=0}^{S^2} \sum_{j=0}^{B} \Bbb{1}^{noobj}_{ij} (C_i-\hat{C_i})^2 \)Box Loss \( \lambda_{coord} \displaystyle\sum_{i=0}^{S^2} \sum_{j=0}^{B} \Bbb{1}^{obj}_{ij} [ (x_i-\hat{x}_i)^2 + (y_i-\hat{y}_i)^2 + (\sqrt{w_i}-\sqrt{\hat{w}_i})^2 + (\sqrt{h_i}-\sqrt{\hat{h_i}})^2 ] \)
여기서 \( \Bbb{1}^{obj}_{i} \)의 의미는 Ground Truth(7x7x25)에서 confidence score가 1.인 경우, 즉, Classification Loss는 Ground Truth의 Confidence score가 1.인 경우 20개 클래스 예측값 차이 제곱의 총합. Confidence Loss는 Ground Truth의 Confidence score가 1.이고 두 박스 중 IoU가 더 큰 박스의 Confidence score 차이 제곱과, 그렇지 않은 경우의 Confidence score 차이 제곱 x \( \lambda_{noobj}=0.5 \)의 총합.
Box Loss는 Ground Truth의 Confidence score가 1.이고 두 박스 중 IoU가 더 큰 박스의 x좌표 차이 제곱, y좌표 차이 제곱, 스퀘어루트한 w값 차이 제곱, 스퀘어루트한 h값 차이 제곱의 총합. |
|
| 학습하는 동안 배치 사이즈는 64, Optimizer의 모멘텀은 0.9, Decay는 0.0005로 한다. |
|
|
학습률(Learning Rate) 스케쥴은 75 epochs까지 0.001에서 0.01로 점차 증가 시키고, 105 epochs까지 0.001, 135 epochs까지 0.0001로 한다. |
|
|
Test Dataset에 대한 1 Batch 추론(Inference) 결과
Ground Truth: 파랑 (분류명과 중심점 표시) |
|